{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "<p>This tutorial presents <a href=\"\">Neural Combinatorial Optimization with Reinforcement Learning</a>. Focusing on the traveling salesman problem (TSP) and train a recurrent neural network that, given a set of city coordinates, predicts a distribution over different city permutations. Using\n",
    "negative tour length as the reward signal, the model optimize the parameters of the recurrent\n",
    "neural network using a policy gradient method. </p><p>Despite the computational expense, without much engineering and\n",
    "heuristic designing, Neural Combinatorial Optimization achieves close to optimal\n",
    "results on 2D Euclidean graphs with up to 100 nodes.</p><p>\n",
    "Previous attempts used supervised learning. Learning from examples in such a\n",
    "way is undesirable for NP-hard problems because (1) the performance of the model is tied to the\n",
    "quality of the supervised labels, (2) getting high-quality labeled data is expensive and may be infeasible\n",
    "for new problem statements, (3) one cares more about finding a competitive solution more than\n",
    "replicating the results of another algorithm. By contrast, Reinforcement Learning (RL) provides an appropriate paradigm for training\n",
    "neural networks for combinatorial optimization, especially because these problems have relatively\n",
    "simple reward mechanisms that could be even used at test time. </p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.autograd as autograd\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "USE_CUDA = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "from tqdm import tqdm\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Generating dataset for TSP Task</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class TSPDataset(Dataset):\n",
    "    \n",
    "    def __init__(self, num_nodes, num_samples, random_seed=111):\n",
    "        super(TSPDataset, self).__init__()\n",
    "        torch.manual_seed(random_seed)\n",
    "\n",
    "        self.data_set = []\n",
    "        for l in tqdm(range(num_samples)):\n",
    "            x = torch.FloatTensor(2, num_nodes).uniform_(0, 1)\n",
    "            self.data_set.append(x)\n",
    "\n",
    "        self.size = len(self.data_set)\n",
    "\n",
    "    def __len__(self):\n",
    "        return self.size\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        return self.data_set[idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train_size = 1000000\n",
    "val_size = 10000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1000000/1000000 [00:01<00:00, 662672.59it/s]\n",
      "100%|██████████| 10000/10000 [00:00<00:00, 785980.06it/s]\n",
      "100%|██████████| 1000000/1000000 [00:01<00:00, 547748.62it/s]\n",
      "100%|██████████| 10000/10000 [00:00<00:00, 636706.49it/s]\n"
     ]
    }
   ],
   "source": [
    "train_20_dataset = TSPDataset(20, train_size)\n",
    "val_20_dataset   = TSPDataset(20, val_size)\n",
    "\n",
    "train_50_dataset = TSPDataset(50, train_size)\n",
    "val_50_dataset   = TSPDataset(50, val_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Reward</h3>\n",
    "<p>\n",
    "Given an input graph, represented as a sequence of n cities in a two dimensional space, the task is finding a permutation of the points π, termed a tour, that visits each city once and has the minimum\n",
    "total length. Tthe length of a tour is defined by a permutation π.\n",
    "</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reward(sample_solution, USE_CUDA=False):\n",
    "    \"\"\"\n",
    "    Args:\n",
    "        sample_solution seq_len of [batch_size]\n",
    "    \"\"\"\n",
    "    batch_size = sample_solution[0].size(0)\n",
    "    n = len(sample_solution)\n",
    "    tour_len = Variable(torch.zeros([batch_size]))\n",
    "    \n",
    "    if USE_CUDA:\n",
    "        tour_len = tour_len.cuda()\n",
    "\n",
    "    for i in range(n - 1):\n",
    "        tour_len += torch.norm(sample_solution[i] - sample_solution[i + 1], dim=1)\n",
    "    \n",
    "    tour_len += torch.norm(sample_solution[n - 1] - sample_solution[0], dim=1)\n",
    "\n",
    "    return tour_len"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Attention mechanism</h3>\n",
    "<p>\n",
    "Using two types of attention mechanism: \"Dot\" and \"Bahdanau\" . More details in <a href=\"http://aclweb.org/anthology/D15-1166\">Effective Approaches to Attention-based Neural Machine Translation</a></p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "a_t(s) = align(h_t, \\bar h_s)  = \\dfrac{exp(score(h_t, \\bar h_s))}{\\sum_{s'} exp(score(h_t, \\bar h_{s'}))}\n",
    "$$\n",
    "\n",
    "$$\n",
    "score(h_t, \\bar h_s) =\n",
    "\\begin{cases}\n",
    "h_t ^\\top \\bar h_s & Dot \\\\\n",
    "v_a ^\\top \\tanh(\\textbf{W}_a [ h_t ; \\bar h_s ]) & Bahdanau\n",
    "\\end{cases}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Attention(nn.Module):\n",
    "    def __init__(self, hidden_size, use_tanh=False, C=10, name='Bahdanau', use_cuda=USE_CUDA):\n",
    "        super(Attention, self).__init__()\n",
    "        \n",
    "        self.use_tanh = use_tanh\n",
    "        self.C = C\n",
    "        self.name = name\n",
    "        \n",
    "        if name == 'Bahdanau':\n",
    "            self.W_query = nn.Linear(hidden_size, hidden_size)\n",
    "            self.W_ref   = nn.Conv1d(hidden_size, hidden_size, 1, 1)\n",
    "\n",
    "            V = torch.FloatTensor(hidden_size)\n",
    "            if use_cuda:\n",
    "                V = V.cuda()  \n",
    "            self.V = nn.Parameter(V)\n",
    "            self.V.data.uniform_(-(1. / math.sqrt(hidden_size)) , 1. / math.sqrt(hidden_size))\n",
    "            \n",
    "        \n",
    "    def forward(self, query, ref):\n",
    "        \"\"\"\n",
    "        Args: \n",
    "            query: [batch_size x hidden_size]\n",
    "            ref:   ]batch_size x seq_len x hidden_size]\n",
    "        \"\"\"\n",
    "        \n",
    "        batch_size = ref.size(0)\n",
    "        seq_len    = ref.size(1)\n",
    "        \n",
    "        if self.name == 'Bahdanau':\n",
    "            ref = ref.permute(0, 2, 1)\n",
    "            query = self.W_query(query).unsqueeze(2)  # [batch_size x hidden_size x 1]\n",
    "            ref   = self.W_ref(ref)  # [batch_size x hidden_size x seq_len] \n",
    "            expanded_query = query.repeat(1, 1, seq_len) # [batch_size x hidden_size x seq_len]\n",
    "            V = self.V.unsqueeze(0).unsqueeze(0).repeat(batch_size, 1, 1) # [batch_size x 1 x hidden_size]\n",
    "            logits = torch.bmm(V, F.tanh(expanded_query + ref)).squeeze(1)\n",
    "            \n",
    "        elif self.name == 'Dot':\n",
    "            query  = query.unsqueeze(2)\n",
    "            logits = torch.bmm(ref, query).squeeze(2) #[batch_size x seq_len x 1]\n",
    "            ref = ref.permute(0, 2, 1)\n",
    "        \n",
    "        else:\n",
    "            raise NotImplementedError\n",
    "        \n",
    "        if self.use_tanh:\n",
    "            logits = self.C * F.tanh(logits)\n",
    "        else:\n",
    "            logits = logits  \n",
    "        return ref, logits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Graph Embedding</h3>\n",
    "<p>\n",
    "This is simple node embedding. For more advanced methods see <a href=\"https://arxiv.org/pdf/1705.02801.pdf\">Graph Embedding Techniques, Applications, and Performance: A Survey</a>\n",
    "</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class GraphEmbedding(nn.Module):\n",
    "    def __init__(self, input_size, embedding_size, use_cuda=USE_CUDA):\n",
    "        super(GraphEmbedding, self).__init__()\n",
    "        self.embedding_size = embedding_size\n",
    "        self.use_cuda = use_cuda\n",
    "        \n",
    "        self.embedding = nn.Parameter(torch.FloatTensor(input_size, embedding_size)) \n",
    "        self.embedding.data.uniform_(-(1. / math.sqrt(embedding_size)), 1. / math.sqrt(embedding_size))\n",
    "        \n",
    "    def forward(self, inputs):\n",
    "        batch_size = inputs.size(0)\n",
    "        seq_len    = inputs.size(2)\n",
    "        embedding = self.embedding.repeat(batch_size, 1, 1)  \n",
    "        embedded = []\n",
    "        inputs = inputs.unsqueeze(1)\n",
    "        for i in range(seq_len):\n",
    "            embedded.append(torch.bmm(inputs[:, :, :, i].float(), embedding))\n",
    "        embedded = torch.cat(embedded, 1)\n",
    "        return embedded"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Pointer Network</h3>\n",
    "<p><a href=\"https://arxiv.org/abs/1506.03134\">Pointer Networks\n",
    "</a></p>\n",
    "<p>Check my tutorial - <a href=\"https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Intro%20to%20Pointer%20Network.ipynb\">intro to Pointer Networks</a></p>\n",
    "<p>The model solves the problem of variable size output dictionaries using a recently proposed mechanism of neural attention. It differs from the previous attention attempts in that, instead of using attention to blend hidden units of an encoder to a context vector at each decoder step, it uses attention as a pointer to select a member of the input sequence as the output.</p>\n",
    "<img src=\"imgs/Снимок экрана 2017-12-26 в 4.30.58 ДП.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class PointerNet(nn.Module):\n",
    "    def __init__(self, \n",
    "            embedding_size,\n",
    "            hidden_size,\n",
    "            seq_len,\n",
    "            n_glimpses,\n",
    "            tanh_exploration,\n",
    "            use_tanh,\n",
    "            attention,\n",
    "            use_cuda=USE_CUDA):\n",
    "        super(PointerNet, self).__init__()\n",
    "        \n",
    "        self.embedding_size = embedding_size\n",
    "        self.hidden_size    = hidden_size\n",
    "        self.n_glimpses     = n_glimpses\n",
    "        self.seq_len        = seq_len\n",
    "        self.use_cuda       = use_cuda\n",
    "        \n",
    "        \n",
    "        self.embedding = GraphEmbedding(2, embedding_size, use_cuda=use_cuda)\n",
    "        self.encoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
    "        self.decoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
    "        self.pointer = Attention(hidden_size, use_tanh=use_tanh, C=tanh_exploration, name=attention, use_cuda=use_cuda)\n",
    "        self.glimpse = Attention(hidden_size, use_tanh=False, name=attention, use_cuda=use_cuda)\n",
    "        \n",
    "        self.decoder_start_input = nn.Parameter(torch.FloatTensor(embedding_size))\n",
    "        self.decoder_start_input.data.uniform_(-(1. / math.sqrt(embedding_size)), 1. / math.sqrt(embedding_size))\n",
    "        \n",
    "    def apply_mask_to_logits(self, logits, mask, idxs): \n",
    "        batch_size = logits.size(0)\n",
    "        clone_mask = mask.clone()\n",
    "\n",
    "        if idxs is not None:\n",
    "            clone_mask[[i for i in range(batch_size)], idxs.data] = 1\n",
    "            logits[clone_mask] = -np.inf\n",
    "        return logits, clone_mask\n",
    "            \n",
    "    def forward(self, inputs):\n",
    "        \"\"\"\n",
    "        Args: \n",
    "            inputs: [batch_size x 1 x sourceL]\n",
    "        \"\"\"\n",
    "        batch_size = inputs.size(0)\n",
    "        seq_len    = inputs.size(2)\n",
    "        assert seq_len == self.seq_len\n",
    "        \n",
    "        embedded = self.embedding(inputs)\n",
    "        encoder_outputs, (hidden, context) = self.encoder(embedded)\n",
    "        \n",
    "        \n",
    "        prev_probs = []\n",
    "        prev_idxs = []\n",
    "        mask = torch.zeros(batch_size, seq_len).byte()\n",
    "        if self.use_cuda:\n",
    "            mask = mask.cuda()\n",
    "            \n",
    "        idxs = None\n",
    "       \n",
    "        decoder_input = self.decoder_start_input.unsqueeze(0).repeat(batch_size, 1)\n",
    "        \n",
    "        for i in range(seq_len):\n",
    "            \n",
    "            \n",
    "            _, (hidden, context) = self.decoder(decoder_input.unsqueeze(1), (hidden, context))\n",
    "            \n",
    "            query = hidden.squeeze(0)\n",
    "            for i in range(self.n_glimpses):\n",
    "                ref, logits = self.glimpse(query, encoder_outputs)\n",
    "                logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
    "                query = torch.bmm(ref, F.softmax(logits).unsqueeze(2)).squeeze(2) \n",
    "                \n",
    "                \n",
    "            _, logits = self.pointer(query, encoder_outputs)\n",
    "            logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
    "            probs = F.softmax(logits)\n",
    "            \n",
    "            \n",
    "            idxs = probs.multinomial().squeeze(1)\n",
    "            for old_idxs in prev_idxs:\n",
    "                if old_idxs.eq(idxs).data.any():\n",
    "                    print seq_len\n",
    "                    print(' RESAMPLE!')\n",
    "                    idxs = probs.multinomial().squeeze(1)\n",
    "                    break\n",
    "            decoder_input = embedded[[i for i in range(batch_size)], idxs.data, :] \n",
    "            \n",
    "            prev_probs.append(probs)\n",
    "            prev_idxs.append(idxs)\n",
    "            \n",
    "        return prev_probs, prev_idxs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Optimization with policy gradients</h3>\n",
    "<p>Model-free policy-based Reinforcement Learning to optimize the parameters of a pointer network using the well-known REINFORCE algorithm</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class CombinatorialRL(nn.Module):\n",
    "    def __init__(self, \n",
    "            embedding_size,\n",
    "            hidden_size,\n",
    "            seq_len,\n",
    "            n_glimpses,\n",
    "            tanh_exploration,\n",
    "            use_tanh,\n",
    "            reward,\n",
    "            attention,\n",
    "            use_cuda=USE_CUDA):\n",
    "        super(CombinatorialRL, self).__init__()\n",
    "        self.reward = reward\n",
    "        self.use_cuda = use_cuda\n",
    "        \n",
    "        self.actor = PointerNet(\n",
    "                embedding_size,\n",
    "                hidden_size,\n",
    "                seq_len,\n",
    "                n_glimpses,\n",
    "                tanh_exploration,\n",
    "                use_tanh,\n",
    "                attention,\n",
    "                use_cuda)\n",
    "\n",
    "\n",
    "    def forward(self, inputs):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            inputs: [batch_size, input_size, seq_len]\n",
    "        \"\"\"\n",
    "        batch_size = inputs.size(0)\n",
    "        input_size = inputs.size(1)\n",
    "        seq_len    = inputs.size(2)\n",
    "        \n",
    "        probs, action_idxs = self.actor(inputs)\n",
    "       \n",
    "        actions = []\n",
    "        inputs = inputs.transpose(1, 2)\n",
    "        for action_id in action_idxs:\n",
    "            actions.append(inputs[[x for x in range(batch_size)], action_id.data, :])\n",
    "\n",
    "            \n",
    "        action_probs = []    \n",
    "        for prob, action_id in zip(probs, action_idxs):\n",
    "            action_probs.append(prob[[x for x in range(batch_size)], action_id.data])\n",
    "\n",
    "        R = self.reward(actions, self.use_cuda)\n",
    "        \n",
    "        return R, action_probs, actions, action_idxs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "embedding_size = 128\n",
    "hidden_size    = 128\n",
    "n_glimpses = 1\n",
    "tanh_exploration = 10\n",
    "use_tanh = True\n",
    "\n",
    "beta = 0.9\n",
    "max_grad_norm = 2."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Creating two models:</h2>\n",
    "<h3>1. Pointer Network with Dot Attention - TSP 20</h3><h3> 2. Pointer Network with Bahdanau Attention - TSP 50</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "tsp_20_model = CombinatorialRL(\n",
    "        embedding_size,\n",
    "        hidden_size,\n",
    "        20,\n",
    "        n_glimpses, \n",
    "        tanh_exploration,\n",
    "        use_tanh,\n",
    "        reward,\n",
    "        attention=\"Dot\",\n",
    "        use_cuda=USE_CUDA)\n",
    "\n",
    "tsp_50_model = CombinatorialRL(\n",
    "        embedding_size,\n",
    "        hidden_size,\n",
    "        50,\n",
    "        n_glimpses, \n",
    "        tanh_exploration,\n",
    "        use_tanh,\n",
    "        reward,\n",
    "        attention=\"Bahdanau\",\n",
    "        use_cuda=USE_CUDA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if USE_CUDA:\n",
    "    tsp_20_model = tsp_20_model.cuda()\n",
    "    tsp_50_model = tsp_50_model.cuda()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Simple Training Class</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class TrainModel:\n",
    "    def __init__(self, model, train_dataset, val_dataset, batch_size=128, threshold=None, max_grad_norm=2.):\n",
    "        self.model = model\n",
    "        self.train_dataset = train_dataset\n",
    "        self.val_dataset   = val_dataset\n",
    "        self.batch_size = batch_size\n",
    "        self.threshold = threshold\n",
    "        \n",
    "        self.train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=1)\n",
    "        self.val_loader   = DataLoader(val_dataset, batch_size=batch_size, shuffle=True, num_workers=1)\n",
    "\n",
    "        self.actor_optim   = optim.Adam(model.actor.parameters(), lr=1e-4)\n",
    "        self.max_grad_norm = max_grad_norm\n",
    "        \n",
    "        self.train_tour = []\n",
    "        self.val_tour   = []\n",
    "        \n",
    "        self.epochs = 0\n",
    "    \n",
    "    def train_and_validate(self, n_epochs):\n",
    "        critic_exp_mvg_avg = torch.zeros(1)\n",
    "        if USE_CUDA: \n",
    "            critic_exp_mvg_avg = critic_exp_mvg_avg.cuda()\n",
    "\n",
    "        for epoch in range(n_epochs):\n",
    "            for batch_id, sample_batch in enumerate(self.train_loader):\n",
    "                self.model.train()\n",
    "\n",
    "                inputs = Variable(sample_batch)\n",
    "                inputs = inputs.cuda()\n",
    "\n",
    "                R, probs, actions, actions_idxs = self.model(inputs)\n",
    "\n",
    "                if batch_id == 0:\n",
    "                    critic_exp_mvg_avg = R.mean()\n",
    "                else:\n",
    "                    critic_exp_mvg_avg = (critic_exp_mvg_avg * beta) + ((1. - beta) * R.mean())\n",
    "\n",
    "\n",
    "                advantage = R - critic_exp_mvg_avg\n",
    "\n",
    "                logprobs = 0\n",
    "                for prob in probs: \n",
    "                    logprob = torch.log(prob)\n",
    "                    logprobs += logprob\n",
    "                logprobs[logprobs < -1000] = 0.  \n",
    "\n",
    "                reinforce = advantage * logprobs\n",
    "                actor_loss = reinforce.mean()\n",
    "\n",
    "                self.actor_optim.zero_grad()\n",
    "                actor_loss.backward()\n",
    "                torch.nn.utils.clip_grad_norm(self.model.actor.parameters(),\n",
    "                                    float(self.max_grad_norm), norm_type=2)\n",
    "\n",
    "                self.actor_optim.step()\n",
    "\n",
    "                critic_exp_mvg_avg = critic_exp_mvg_avg.detach()\n",
    "\n",
    "                self.train_tour.append(R.mean().data[0])\n",
    "\n",
    "                if batch_id % 10 == 0:\n",
    "                    self.plot(self.epochs)\n",
    "\n",
    "                if batch_id % 100 == 0:    \n",
    "\n",
    "                    self.model.eval()\n",
    "                    for val_batch in self.val_loader:\n",
    "                        inputs = Variable(val_batch)\n",
    "                        inputs = inputs.cuda()\n",
    "\n",
    "                        R, probs, actions, actions_idxs = self.model(inputs)\n",
    "                        self.val_tour.append(R.mean().data[0])\n",
    "\n",
    "            if self.threshold and self.train_tour[-1] < self.threshold:\n",
    "                print \"EARLY STOPPAGE!\"\n",
    "                break\n",
    "                \n",
    "            self.epochs += 1\n",
    "                \n",
    "    def plot(self, epoch):\n",
    "        clear_output(True)\n",
    "        plt.figure(figsize=(20,5))\n",
    "        plt.subplot(131)\n",
    "        plt.title('train tour length: epoch %s reward %s' % (epoch, self.train_tour[-1] if len(self.train_tour) else 'collecting'))\n",
    "        plt.plot(self.train_tour)\n",
    "        plt.grid()\n",
    "        plt.subplot(132)\n",
    "        plt.title('val tour length: epoch %s reward %s' % (epoch, self.val_tour[-1] if len(self.val_tour) else 'collecting'))\n",
    "        plt.plot(self.val_tour)\n",
    "        plt.grid()\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "<h2>TSP 20 Results of Pointer Network with Dot Attention</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "tsp_20_train = TrainModel(tsp_20_model, \n",
    "                        train_20_dataset, \n",
    "                        val_20_dataset, \n",
    "                        threshold=3.99)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n/wEa4UrbKl9wggAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f045b832d50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tsp_20_train.train_and_validate(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "<h2>TSP 50 Results of Pointer Network with Bahdanau Attention</h2>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "train_50_train = TrainModel(tsp_50_model, \n",
    "                            train_50_dataset, \n",
    "                            val_50_dataset, \n",
    "                            threshold=6.4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f399bcda7d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_50_train.train_and_validate(10)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
